

def options():

    def decorator(target):

        def wrapper(*args, **kwargs):
            type(target)
            print 'Calling function "%s" with arguments %s and keyword arguments %s' % (target.__name__, args, kwargs)
            return target(*args, **kwargs)

        return wrapper


    return decorator


@options()
def target(a, b, debug_level=0):
    if debug_level: print '[Debug Level %s] I am the target function' % debug_level
    return a+b

@options()
def target1(a, b, debug_level=0):
    if debug_level: print '[Debug Level %s] I am the target1 function' % debug_level
    return a+b


target(1,2)
target1(1,2)

